package DAL;

import java.io.*;
import java.util.*;

/**
 * Classe responsavel pela leitura dos dados de arquivos.
 *
 * @author (R Soares)
 * @version (1.0 - 07.04.2010)
 */
public abstract class ArquivoControleDAL
{
    // Variáveis de Instância -----------------------------------------------------*
    private File _arquivo;

    // Construtores ----------------------------------------------------------------*
    /**
     * O construtor da classe recebe o nome do arquivo que será lido e o obtem a partir da
     * classe GeradorArquivosControle.
     */
    protected ArquivoControleDAL(String nomeArquivo)
    {
            try{
                    _arquivo = new Conexao().obterArquivoControle(nomeArquivo);
             }

             catch(FileNotFoundException e) {
                    System.out.println("Arquivo não localizado : \\DadosControle\\" + nomeArquivo + ".ctr");
             }
    }

    // Métodos ---------------------------------------------------------------------*
    /**
     *  Método que efetua a leitura do arquivo informado na geração do objeto LeitorArquivo.
     *
     * @return     boolean : TRUE - Arquivo lido com sucesso.  FALSE : Fim de arquivo ou erro de leitura.
     */
    protected ArrayList lerArquivo()
    {
         ArrayList linhasArquivo = new ArrayList();
         BufferedReader reader = null;

         String linha = null;

          try{
               reader = new BufferedReader(new FileReader(_arquivo) );

               linha = reader.readLine();

                while (linha != null)
                {
                    linhasArquivo.add(linha);
                    linha = reader.readLine();
                }
         }


         catch(IOException e) {
                System.out.println("Erro ao tentar ler dados no arquivo : \\DadosControle\\" +
                                                                                                                       _arquivo.getName() + ".ctr");
         }

         finally{

                if (reader != null)
                {

                        try{
                            reader.close() ;
                        }

                        catch(IOException e) {
                            System.out.println("Erro ao tentar fechar o arquivo : " + _arquivo.getName() + ".ctr");
                        }

                 } // fim if

                return linhasArquivo;

           } // fim finally

      } // fim lerArquivo

    /**
     * Metodo que realiza a gravação de dados em arquivos.
     *
     * @param  dados : ArrayList : Lista de dados que serão gravados.
     */
    protected void escreverArquivo(ArrayList dados)
    {
         FileWriter writer = null;
         Iterator it = dados.iterator();

          try{

              writer = new FileWriter( _arquivo);

              while( it.hasNext() )
              {
                    writer.write ( (String) it.next() );
                    writer.write ("\r\n");
               }
          }

          catch(FileNotFoundException e) {
                System.out.println("Arquivo não localizado : \\DadosControle\\" + _arquivo.getName() + ".ctr");
          }

          catch(IOException e) {
                System.out.println("Erro ao tentar escrever dados no arquivo : \\DadosControle\\" + _arquivo.getName() + ".ctr");
         }

         finally{

                if (writer != null)
                {

                        try{
                            writer.close() ;
                        }

                        catch(IOException e) {
                            System.out.println("Erro ao tentar fechar o arquivo : \\DadosControle\\" + _arquivo.getName() + ".ctr");
                        }

                 } // fim if

           } // fim finally

      } // fim escreverArquivo


    /**
     * Este método converte uma String em um valor Decimal (float). Caso a palavra não
     * possa gerar o valor, lança uma excessão "NumberFormatException".
     *
     * @param   String : Palavra - Palavra a ser convertida
     * @return   Float
     */
    protected float obterValorDecimal(String palavra) throws NumberFormatException
    {
        Float valor = new Float(palavra);

        return valor.floatValue();

    } // Fim método obterValorDecimal

    /**
     * Este método converte uma String em um valor Inteiro (int). Caso a palavra não
     * possa gerar o valor, lança uma excessão "NumberFormatException".
     *
     * @param   String : Palavra - Palavra a ser convertida
     * @return   int
     */
    protected int obterValorInteiro(String palavra) throws NumberFormatException
    {
        Integer valor = new Integer(palavra);

        return valor.intValue();

    } // Fim método obterValorInteiro

}  // FIM CLASSE
